from functools import wraps

from typing import List, Union

from module_admin.aspect.interface_auth import CheckUserInterfaceAuth, CheckUserOwnRoles


def check_user_interface_auth(perm: Union[str, List], is_strict: bool = False):
    """
    校验当前用戶是否具有接口权限。使用注解方式调用 CheckUserInterfaceAuth
    :param perm: 支持传递str或str列表，校验当前用户是否有此权限
    :param is_strict: True为严格校验，perm中所有权限必须全部满足；False为宽松校验，perm中只要有一个满足即可
    :return:
    """

    def decorator(func):
        # 真正的装饰器函数，它包装了原始函数
        @wraps(func)
        def wrapper(*args, **kwargs):
            # 执行前的逻辑，无此权限时，会抛出异常
            validate = CheckUserInterfaceAuth(perm, is_strict)
            validate()
            # 执行被装饰函数
            result = func(*args, **kwargs)
            # 执行后的逻辑
            return result
        return wrapper
    return decorator


def check_user_own_roles(role_key: Union[str, List], is_strict: bool = False):
    """
    校验当前用戶是否拥有特定角色 CheckUserOwnRoles
    :param role_key: 支持传递str或str列表，校验当前用户是否拥有指定角色
    :param is_strict: True为严格校验，perm中所有权限必须全部满足；False为宽松校验，perm中只要有一个满足即可
    :return:
    """

    def decorator(func):
        # 真正的装饰器函数，它包装了原始函数
        @wraps(func)
        def wrapper(*args, **kwargs):
            # 执行前的逻辑，无此权限时，会抛出异常
            validate = CheckUserOwnRoles(role_key, is_strict)
            validate()
            # 执行被装饰函数
            result = func(*args, **kwargs)
            # 执行后的逻辑
            return result
        return wrapper
    return decorator
